import newMessageSound from "@/assets/rings/ddd.wav";

// 存储音频实例，避免重复创建
const audioInstances = {
  newMessage: null,
};

/**
 * 检查是否在浏览器环境
 */
const isBrowser = typeof window !== "undefined";

/**
 * 检查是否支持通知API
 */
const isNotificationSupported = isBrowser && "Notification" in window;

/**
 * 检查是否支持音频API
 */
const isAudioSupported = isBrowser && "Audio" in window;

/**
 * 声音播放服务
 */
export const SoundService = {
  /**
   * 是否已初始化
   */
  initialized: false,

  /**
   * 是否启用声音
   */
  soundEnabled: true,

  /**
   * 是否启用通知
   */
  notificationEnabled: true,

  /**
   * 初始化声音服务
   */
  init() {
    if (this.initialized || !isBrowser) return;

    // 预加载声音
    if (isAudioSupported && this.soundEnabled) {
      this.preloadSounds();
    }

    // 检查通知权限
    if (isNotificationSupported && this.notificationEnabled) {
      this.checkNotificationPermission();
    }

    this.initialized = true;
    return this;
  },

  /**
   * 开启/关闭声音
   * @param {boolean} enabled 是否启用声音
   */
  toggleSound(enabled) {
    this.soundEnabled = enabled;
    return this;
  },

  /**
   * 开启/关闭通知
   * @param {boolean} enabled 是否启用通知
   */
  toggleNotification(enabled) {
    this.notificationEnabled = enabled;
    return this;
  },

  /**
   * 预加载所有声音
   */
  preloadSounds() {
    if (!isAudioSupported) return;

    try {
      // 新消息提示音
      audioInstances.newMessage = new Audio(newMessageSound);
      audioInstances.newMessage.preload = "auto";

      // 可以在这里添加更多声音
    } catch (error) {
      console.error("预加载声音失败:", error);
    }
  },

  /**
   * 播放新消息提示音
   */
  playNewMessageSound() {
    if (!this.soundEnabled) return;
    this.playSound("newMessage");
  },

  /**
   * 播放指定声音
   * @param {string} soundName 声音名称
   */
  playSound(soundName) {
    if (!isAudioSupported || !this.soundEnabled) return;

    const audio = audioInstances[soundName];
    if (!audio) return;

    try {
      // 如果正在播放，先停止
      if (!audio.paused) {
        audio.pause();
        audio.currentTime = 0;
      }

      // 重置播放位置并播放
      audio.currentTime = 0;

      // 返回播放Promise，允许调用者处理错误
      return audio.play().catch((error) => {
        // 用户交互前自动播放可能被浏览器阻止
        console.warn(`播放声音失败: ${error.message}`);

        // 静默失败，不抛出错误
        return Promise.resolve();
      });
    } catch (error) {
      console.error(`播放声音失败: ${error.message}`);
      return Promise.resolve();
    }
  },

  /**
   * 停止指定声音
   * @param {string} soundName 声音名称
   */
  stopSound(soundName) {
    if (!isAudioSupported) return;

    const audio = audioInstances[soundName];
    if (!audio) return;

    try {
      audio.pause();
      audio.currentTime = 0;
    } catch (error) {
      console.error(`停止声音失败: ${error.message}`);
    }
  },

  /**
   * 检查通知权限
   * @returns {Promise<boolean>} 是否有通知权限
   */
  async checkNotificationPermission() {
    // 检查浏览器是否支持通知
    if (!isNotificationSupported || !this.notificationEnabled) {
      return false;
    }

    // 已经获得权限
    if (Notification.permission === "granted") {
      return true;
    }

    // 未请求过权限，请求权限
    if (Notification.permission !== "denied") {
      try {
        const permission = await Notification.requestPermission();
        return permission === "granted";
      } catch (error) {
        console.error("请求通知权限失败:", error);
        return false;
      }
    }

    return false;
  },

  /**
   * 显示系统通知
   * @param {string} title 通知标题
   * @param {Object} options 通知选项
   * @returns {Promise<Notification|null>} 通知实例
   */
  async showNotification(title, options = {}) {
    if (!isNotificationSupported || !this.notificationEnabled) return null;

    try {
      const hasPermission = await this.checkNotificationPermission();
      if (!hasPermission) return null;

      const defaultOptions = {
        icon: "/favicon.ico", // 应用图标
        badge: "/favicon.ico",
        requireInteraction: false, // 通知会自动关闭
        silent: true, // 不使用系统声音，我们自己控制声音
        tag: "chat-notification", // 标签，相同标签的通知会被替换
        ...options,
      };

      const notification = new Notification(title, defaultOptions);

      // 点击通知时的行为
      notification.onclick = () => {
        // 聚焦窗口
        window.focus();
        // 如果有自定义点击处理函数
        if (options.onClick) {
          options.onClick(notification);
        }
        // 关闭通知
        notification.close();
      };

      // 自动关闭
      if (!defaultOptions.requireInteraction) {
        setTimeout(() => {
          notification.close();
        }, 10000); // 10秒后自动关闭
      }

      return notification;
    } catch (error) {
      console.error("显示通知失败:", error);
      return null;
    }
  },

  /**
   * 显示新消息通知
   * @param {string} senderName 发送者名称
   * @param {string} message 消息内容
   * @param {Function} onClick 点击通知的回调函数
   */
  async showNewMessageNotification(senderName, message, onClick) {
    // 播放声音
    this.playNewMessageSound();

    // 如果不支持通知或通知被禁用，仅播放声音
    if (!isNotificationSupported || !this.notificationEnabled) {
      return null;
    }
    // 显示通知
    return this.showNotification(`新消息: ${senderName}`, {
      body: message,
      tag: `new-message-${senderName}`,
      requireInteraction: false, // 不需要用户交互，自动关闭
      onClick,
    });
  },

  /**
   * 显示新客户通知
   * @param {string} customerName 客户名称
   * @param {Function} onClick 点击通知的回调函数
   */
  async showNewCustomerNotification(customerName, onClick) {
    // 播放声音
    this.playNewMessageSound();

    // 如果不支持通知或通知被禁用，仅播放声音
    if (!isNotificationSupported || !this.notificationEnabled) {
      return null;
    }

    // 显示通知
    return this.showNotification("新客户接入", {
      body: `客户 ${customerName} 已接入，等待回复`,
      tag: `new-customer-${customerName}`,
      requireInteraction: true, // 需要用户交互，不自动关闭
      onClick,
    });
  },
};

// 自动初始化
if (isBrowser) {
  SoundService.init();
}

// 导出默认实例
export default SoundService;
